﻿#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<vector>


using namespace std;

// 实例演⽰三种继承关系下基类成员的各类型成员访问关系的变化  
//class Person
//{
//public:
//	void p_print()
//	{
//		cout << _name << endl;
//		cout << _age << endl;
//	}
//protected:
//	string _name="张三"; // 姓名 
//private:
//	int _age=18; // 年龄 
//};
//
//
//class Student : public Person
//{
//public:
//	//可以直接在子类里面访问父类的保护成员
//	void s_print()
//	{
//		cout << _name << endl;
//	}
//protected:
//	int _stunum; // 学号 
//};

////默认是private继承
//class Student : Person
//{
//public:
//	//可以直接在子类里面访问父类的保护成员
//	void s_print()
//	{
//		cout << _name << endl;
//	}
//protected:
//	int _stunum; // 学号 
//};
//
////默认是public继承
//struct Student : Person
//{
//public:
//	//可以直接在子类里面访问父类的保护成员
//	void s_print()
//	{
//		cout << _name << endl;
//	}
//protected:
//	int _stunum; // 学号 
//};
//
//int main()
//{
//	Student s1;
//	s1.p_print();
//	return 0;
//}

//namespace my_stack
//{
//	template<class T>
//	class vector
//	{};
//	 stack和vector的关系，既符合is-a，也符合has-a 
//	template<class T>
//	class stack : public std::vector<T>
//	{
//	public:
//		void push(const T& x)
//		{
//			 基类是类模板时，需要指定⼀下类域， 
//			 否则编译报错:error C3861: “push_back”: 找不到标识符 
//			 因为stack<int>实例化时，也实例化vector<int>了 
//			 但是模版是按需实例化，push_back等成员函数未实例化，所以找不到 
//			vector<T>::push_back(x);
//			push_back(x);
//		}
//		void pop()
//		{
//			vector<T>::pop_back();
//		}
//		const T& top()
//		{
//			return vector<T>::back();
//		}
//		bool empty()
//		{
//			return vector<T>::empty();
//		}
//	};
//}
//int main()
//{
//	my_stack::stack<int> st;
//	st.push(1);
//	st.push(2);
//	st.push(3);
//	while (!st.empty())
//	{
//		cout << st.top() << " ";
//		st.pop();
//	}
//	return 0;
//}

class Person
{
//protected:
	virtual void func()
	{}
public:
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};

class Student : public Person
{
public:
	int _No; // 学号
};

int main()
{
	Student sobj;

	// 1.子类对象可以赋值给父类对象/指针/引用
	Person pobj = sobj;
	Person* pp = &sobj;
	Person& rp = sobj;
	rp._name = "张三";

	//2.父类对象不能赋值给子类对象，这里会编译报错
	//sobj = (Student)pobj;

	// 后面再细讲，这里简单了解一下
	Student* ps1 = dynamic_cast<Student*>(pp);
	cout << ps1 << endl;

	pp = &pobj;
	Student* ps2 = dynamic_cast<Student*>(pp);
	cout << ps2 << endl;

	int i = 0;
	const double& d = i;

	return 0;
}